2. INTRODUÇÃO AO USO DO OSMnx PARA ANÁLISE DE REDES ESPACIAIS#
A biblioteca OSMnx é uma ferramenta de código aberto desenvolvida para facilitar o acesso e a análise de dados geoespaciais do OpenStreetMap (OSM). Com ela, é possível baixar e modelar redes viárias e outras infraestruturas urbanas em qualquer localidade do mundo, usando apenas algumas linhas de código. A OSMnx é construída sobre a biblioteca NetworkX, voltada para criação e manipulação de grafos, e a GeoPandas, que permite o trabalho com dados geoespaciais em Python. Essa integração com a NetworkX possibilita a criação de grafos direcionados que representam redes de ruas e, ao mesmo tempo, a manipulação de dados espaciais complexos por meio da estrutura de GeoDataFrames da GeoPandas.
Em termos práticos, a OSMnx permite a criação de representações de redes urbanas, além da análise de elementos como conectividade, acessibilidade e distribuição espacial de infraestruturas. Por exemplo, é possível baixar a rede viária de uma cidade e, em seguida, calcular o caminho mais curto entre dois pontos, analisar a densidade de interseções ou mesmo visualizar a inclinação média das ruas em áreas com declives, integrando dados de elevação.
As principais funcionalidades da OSMnx para modelagem e análise de redes espaciais incluem a obtenção de redes viárias e infraestruturas urbanas: com um único comando, é possível baixar redes viárias completas, limites administrativos e outros elementos geoespaciais, como edificações e pontos de interesse. Em termos de modelagem e manipulação de infraestruturas, a biblioteca permite construir grafos complexos que representam redes urbanas, como ruas, ciclovias e trilhas, com suporte para diferentes tipos de mobilidade (carro, bicicleta, caminhada). A OSMnx também realiza uma simplificação automática da topologia das redes, consolidando interseções complexas e removendo nós redundantes, o que gera uma representação precisa e funcional da infraestrutura urbana. Outro recurso importante é o cálculo de métricas de rede, como centralidade, conectividade e densidade de interseções, proporcionando uma compreensão mais aprofundada sobre a acessibilidade e o fluxo na rede. Além disso, as redes modeladas podem ser exportadas em formatos compatíveis com outros softwares SIG e de análise de redes, como GraphML, GeoPackage e XML.
Essas funcionalidades tornam a OSMnx uma ferramenta abrangente para quem deseja estudar redes espaciais urbanas e realizar análises detalhadas de infraestrutura, transporte e acessibilidade. Assim, o uso da OSMnx é adequado para uma variedade de projetos e estudos que envolvem análise e modelagem de redes espaciais, incluindo planejamento urbano, acessibilidade e otimização de rotas. No planejamento urbano, a OSMnx permite obter e analisar dados sobre a conectividade de ruas, a distribuição de pontos de interesse e a acessibilidade de diferentes áreas, auxiliando profissionais a avaliar a estrutura de bairros e a infraestrutura de transporte. Em estudos de acessibilidade, a biblioteca facilita o cálculo de distâncias e tempos de viagem entre pontos, sendo útil para análises que buscam medir a acessibilidade a serviços, como escolas, hospitais e áreas comerciais. Já na otimização de rotas, a modelagem de redes e o cálculo de trajetos tornam a OSMnx uma ferramenta valiosa para estudos de otimização de trajetos, considerando fatores como distância, tempo de viagem e declividade das ruas.
O projeto OpenStreetMap
O OpenStreetMap (OSM) é uma plataforma colaborativa de mapeamento que oferece dados geográficos de código aberto, abrangendo uma grande quantidade de informações, como redes de ruas, limites administrativos, edifícios, pontos de interesse, entre outros. Criado em 2004, o OSM é continuamente atualizado por uma comunidade global de voluntários que contribuem com dados coletados por GPS, imagens de satélite e levantamentos de campo. Esses dados estão disponíveis para qualquer pessoa, permitindo uma ampla variedade de aplicações, desde navegação e análise de redes até planejamento urbano e desenvolvimento de aplicativos.
Para facilitar o acesso a esses dados, o OpenStreetMap disponibiliza uma API (Application Programming Interface), que permite consultas e extrações de informações geográficas por meio de código. A API do OSM é projetada para que os usuários possam recuperar dados geoespaciais específicos, como redes viárias e pontos de interesse, em áreas definidas por coordenadas geográficas, limites de cidades, ou caixas delimitadoras. A biblioteca OSMnx utiliza essa API para acessar automaticamente os dados do OpenStreetMap, permitindo que o usuário baixe e analise redes e outros elementos de infraestrutura urbana de maneira simplificada.
Com a OSMnx, é possível fazer consultas personalizadas ao OpenStreetMap, simplificando o processo de acesso a dados e permitindo análises espaciais detalhadas. A descrição completa dos tipos de dados disponíveis no OpenStreetMap (OSM) pode ser encontrada diretamente na Wiki do OpenStreetMap, que é a principal fonte de documentação para todas as tags e categorias de dados mapeados no OSM.
2.1 Preparação do ambiente de trabalho#
Para utilizar a biblioteca OSMnx, é necessário preparar o ambiente com algumas dependências básicas, configurando o Google Colab para suportar todas as funcionalidades da biblioteca.
Requisitos
A OSMnx depende de outras bibliotecas de Python para realizar a modelagem e análise de redes espaciais. As principais dependências incluem:
NetworkX: Biblioteca para manipulação e análise de grafos, necessária para construir redes viárias e infraestruturas.
GeoPandas: Permite a manipulação de dados geoespaciais, transformando as redes obtidas em estruturas que podem ser visualizadas e analisadas geograficamente.
Matplotlib: Utilizada para visualização de dados e redes.
Shapely: Fornece operações geométricas básicas, como interseção e união de polígonos.
Utilizaremos ainda a biblioteca mapclassify, que fornece métodos para classificação de dados espaciais, facilitando a criação de intervalos ou classes para mapear dados geográficos com diferentes esquemas de categorização.
Instalação da OSMnx no Google Colab Para instalar a OSMnx e a mapclassify no Google Colab, execute o seguinte comando para instalar a biblioteca e suas dependências:
# !pip install osmnx
# !pip install mapclassify
import osmnx as ox
import networkx as nx
import matplotlib.pyplot as plt
import geopandas as gpd
import folium
import mapclassify
import warnings
from matplotlib.lines import Line2D
warnings.filterwarnings("ignore", category=DeprecationWarning)
print("OSMnx version:", ox.__version__)
OSMnx version: 1.9.4
2.2 Acessando Dados do OpenStreetMap#
A OSMnx permite que os usuários localizem áreas específicas por meio de geocodificação e consultas diretas ao OpenStreetMap. A geocodificação é o processo de transformar nomes de lugares ou endereços em coordenadas geográficas (latitude e longitude). Com a OSMnx, é possível utilizar essas coordenadas para definir uma área de interesse e baixar dados do OpenStreetMap.
Inicialmente, vamos tentar obter o polígono de São Paulo:
# Nome do local para consulta
nome_local = "São Paulo, Brasil"
# Consulta e obtenção do polígono do local
area = ox.geocode_to_gdf(nome_local)
# Plotagem da área consultada
area.plot()
<AxesSubplot:>
Neste caso, ao usarmos “São Paulo, Brasil”, o OSMnx interpretou essa consulta como o município de São Paulo. Assim, ele retornou o polígono correspondente apenas à cidade de São Paulo, em vez de incluir o estado inteiro. Se quisermos obter o polígono referente ao estado, precisamos ser mais específicos na consulta. Vamos alterar o valor para “Estado de São Paulo, Brasil”, pois isso indica ao OSMnx que queremos o contorno do estado:
# Nome do local para consulta, especificando o estado
nome_local = "Estado de São Paulo, Brasil"
# Consulta e obtenção do polígono do estado
area = ox.geocode_to_gdf(nome_local)
# Plotagem da área consultada
fig, ax = plt.subplots(figsize=(10, 10))
area.plot(ax=ax, color="lightblue", edgecolor="blue")
ax.set_title("Estado de São Paulo")
plt.show()
Com essa mudança, o OSMnx retorna o polígono correspondente ao estado inteiro, não apenas à cidade. Lembre-se, portanto, de que a especificidade é importante: ao referir-se a uma cidade ou um estado, o nome usado na consulta influencia diretamente o resultado obtido.
Agora vamos detalhar como obter o polígono de um bairro específico. Neste capítulo, nossa área de estudo será o bairro da Liberdade, em São Paulo. Para isso, podemos fazer uma consulta específica utilizando o nome do bairro e da cidade.
# Nome do local para consulta
bairro = "Liberdade, São Paulo, Brasil"
# Consulta e obtenção do polígono do local
area = ox.geocode_to_gdf(bairro)
# Plotagem da área consultada
area.plot()
<AxesSubplot:>
O código acima busca e plota o polígono do bairro da Liberdade. No entanto, esse plot é estático e não permite interação, sendo útil apenas para uma visualização inicial.
Para uma visualização mais prática e interativa, vamos centralizar o mapa no bairro da Liberdade e adicionar seu contorno em um mapa da Folium.
Primeiro, calculamos o centro do polígono que representa o bairro, usando-o como ponto de referência para centralizar o mapa. Em seguida, criamos um mapa interativo com o Folium, ajustando o zoom para visualizar adequadamente o bairro. Finalmente, adicionamos o polígono ao mapa, desenhando o contorno do bairro sobre a visualização interativa.
# Consulta e obtenção do polígono do local
area = ox.geocode_to_gdf(bairro)
# Obter o centro do polígono para centralizar o mapa
centro = [area.geometry.centroid.y.values[0], area.geometry.centroid.x.values[0]]
# Criar o mapa usando o centro do bairro
mapa = folium.Map(location=centro, zoom_start=15)
# Adicionar o polígono da área ao mapa
geo_json = area.to_json()
folium.GeoJson(geo_json, name="Liberdade").add_to(mapa)
# Exibir o mapa
mapa
/tmp/ipykernel_12841/1386283566.py:5: UserWarning: Geometry is in a geographic CRS. Results from 'centroid' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.
centro = [area.geometry.centroid.y.values[0], area.geometry.centroid.x.values[0]]
No código acima:
area.geometry.centroid: Calcula o ponto central do polígono para definir a localização inicial do mapa.folium.Map(): Cria um mapa interativo centralizado no ponto calculado e com zoom ajustado.folium.GeoJson(): Transforma o polígono obtido de OSMnx para um formato GeoJSON, adicionando-o ao mapa com o contorno definido.
Agora vamos explorar como extrair e visualizar dados de edificações e infraestrutura urbana no OpenStreetMap (OSM) usando o OSMnx. Vamos nos concentrar em contornos de edifícios e parques no bairro da Liberdade.
Extraindo e Visualizando Contornos de Edifícios
O OpenStreetMap armazena dados detalhados sobre edifícios de muitos locais em todo o mundo, que incluem os contornos (ou footprints) dos prédios. Podemos acessar essas informações utilizando o OSMnx e a tag building.
As tags do OpenStreetMap (OSM) são informações associadas aos elementos mapeados que descrevem suas características. Cada elemento geoespacial no OSM – seja um nó, caminho ou relação – é classificado e detalhado usando tags que consistem em pares de chave e valor. Essas tags fornecem contexto e detalham os objetos mapeados, como estradas, edifícios, rios e outros tipos de infraestrutura e pontos de interesse.
Cada tag é um par chave=valor. A chave representa o tipo de característica, e o valor fornece a especificação dessa característica. Por exemplo:
highway=residentialindica uma estrada de tráfego local.building=yesdescreve um objeto como um edifício.amenity=schoolidentifica uma escola.
As tags do OSM abrangem diversas categorias, algumas das quais são:
Estradas e Trânsito (highway): Inclui tipos de vias como
highway=motorwaypara rodovias ehighway=footwaypara calçadas.Edifícios (building): Tag comum usada para classificar tipos de construções. Exemplo:
building=residential.Áreas Verdes e Natureza (landuse, natural): Inclui
landuse=forestpara áreas florestais enatural=waterpara corpos d’água.Serviços e Equipamentos (amenity): Para descrever locais de serviço, como
amenity=parkingpara estacionamento.Infraestrutura Comercial (shop): Classificação de estabelecimentos comerciais, como
shop=supermarketpara supermercados.Recreação e Turismo (leisure, tourism):
leisure=parkpara parques etourism=hotelpara hotéis.
Ao utilizar uma biblioteca como o OSMnx para acessar dados do OSM, as tags são essenciais para filtrar e escolher os tipos de elementos que queremos obter. Por exemplo, ao buscar uma rede de estradas, você pode usar a tag highway com valores específicos para incluir apenas tipos desejados de vias.
A descrição completa dos tipos de dados disponíveis no OpenStreetMap (OSM) pode ser encontrada diretamente na Wiki do OpenStreetMap, que é a principal fonte de documentação para todas as tags e categorias de dados mapeados no OSM. Abaixo estão os links diretos para algumas páginas importantes que descrevem os tipos de dados e tags comumente usadas:
Página principal das tags – Visão geral das tags do OSM.
Highway – Descrição das classificações de vias e estradas.
Building – Informações sobre tipos de edifícios.
Amenity – Listagem de serviços e equipamentos públicos.
Landuse – Categorias de uso da terra e áreas naturais.
Voltando ao exemplo de aplicação, inicialmente vamos definir as configurações e buscar os contornos dos edifícios no bairro.
# Definindo a tag para buscar contornos de edifícios
tags = {"building": True}
# Extraindo contornos de edifícios no bairro da Liberdade
gdf_edificios = ox.features_from_place(bairro, tags)
print(gdf_edificios.shape) # Exibe o número de edifícios encontrados
(10007, 81)
# Plotando os contornos dos edifícios
fig, ax = ox.plot_footprints(gdf_edificios, figsize=(20, 15))
Nesse código:
features_from_place(): extrai todos os contornos de edifícios para o bairro especificado.plot_footprints(): plota esses contornos em uma visualização estática para uma visão geral rápida dos edifícios.
Visualizando os Contornos dos Edifícios em um Mapa Interativo
Para uma visualização mais detalhada, podemos adicionar esses contornos a um mapa interativo usando o Folium. Isso nos permitirá inspecionar a área e os edifícios com mais flexibilidade.
# Criando o mapa centrado no bairro da Liberdade
mapa = folium.Map(location=centro, zoom_start=15)
# Adicionando o polígono da área ao mapa
geo_json = area.to_json()
folium.GeoJson(geo_json, name="Bairro da Liberdade").add_to(mapa)
# Adicionando os contornos dos edifícios ao mapa
for _, row in gdf_edificios.iterrows():
# Verifica se a geometria é um polígono antes de adicionar ao mapa
if row.geometry.geom_type == 'Polygon':
folium.GeoJson(row.geometry.__geo_interface__, style_function=lambda x: {
'fillColor': 'grey', 'color': 'black', 'weight': 0.5, 'fillOpacity': 0.7
}).add_to(mapa)
# Exibindo o mapa interativo com edifícios
mapa